package com.psytech.app.task.web_ui.client;

import java.util.List;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import com.psytech.app.task.web_ui.shared.UIComment;
import com.psytech.app.task.web_ui.shared.UIGroup;
import com.psytech.app.task.web_ui.shared.UIUser;
import com.psytech.app.task.web_ui.shared.UiTask;

@RemoteServiceRelativePath("task")
public interface TaskManagerService extends RemoteService {

	UiTask saveTask(UiTask task) throws IllegalArgumentException, IllegalStateException;

	/**
	 * Renvoie la listes des tâches reliées à un utilisateur.
	 * 
	 * @param user
	 * @return La liste des tâches liées à l'utilisateur (affectation ou
	 *         création)
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	List<UiTask> listAllTask(UIUser user) throws IllegalArgumentException, IllegalStateException;

	/**
	 * Renvoie toutes les tâches affectées à l'utilisateur.
	 * 
	 * @param user
	 * @return
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	List<UiTask> listAffectedTask(UIUser user) throws IllegalArgumentException, IllegalStateException;

	/**
	 * @return la liste de toutes les tâches de l'équipe
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	List<UiTask> listAllTeamTask() throws IllegalArgumentException, IllegalStateException;

	/**
	 * @return la liste de toutes les tâches non affectées
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	List<UiTask> listUnaffectedTask() throws IllegalArgumentException, IllegalStateException;

	/**
	 * @param taskUid
	 *            uid de la tâche à supprimer
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	void removeTask(String taskUid) throws IllegalArgumentException, IllegalStateException;

	/**
	 * Renvoie la tâche correspondante à 'uid.
	 * 
	 * @param uid
	 * @return la tâche correspondante dans le référentiel
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	UiTask searchTaskByUID(String uid) throws IllegalArgumentException, IllegalStateException;

	/**
	 * @param taskUid
	 *            l'uid de la tâche pour laquelle il faut retrouver un
	 *            commentaire
	 * @return la liste des commentaires associé à la tache
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	List<UIComment> getComments(String taskUid) throws IllegalArgumentException, IllegalStateException;

	/**
	 * @param comment
	 *            commentaire à ajouter
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	void createComment(UIComment comment) throws IllegalArgumentException, IllegalStateException;

	/**
	 * @param commentUid
	 *            uid du commentaire à supprimer
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	void deleteComment(String commentUid) throws IllegalArgumentException, IllegalStateException;

	/**
	 * @return l'utilisateur actullement connecté en fonction de son IP * @throws
	 *         IllegalArgumentException
	 * @throws IllegalStateException
	 */
	UIUser whoAmI() throws IllegalArgumentException, IllegalStateException;

	/**
	 * @return La liste des membre de l'équipe
	 * @param guid
	 *            identifiant du groupe
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	List<UIUser> getTeamMember(String g) throws IllegalArgumentException, IllegalStateException;

	/**
	 * @return liste des groupes auxquels appartient l'utilisateur
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	List<UIGroup> getGroups(String userUid) throws IllegalArgumentException, IllegalStateException;

}
